/*
 * Copyright 2015 the SiChuan MiaoQu Technology Co., Ltd.
 *
 * 四川妙趣科技有限公司    http://www.letoo.com
 *
 * Create Date :  2015/12/21
 */

package com.letoo.sso.core.service;

import com.letoo.sso.common.domain.Result;
import com.letoo.sso.dataaccess.datasource.DataSource;
import com.letoo.sso.dataaccess.domain.dbo.UserTokenDO;

/**
 * user和token关系的服务接口
 * 
 * @author 邓杰
 */
public interface UserTokenService extends BaseService<UserTokenDO> {

    /**
     * 保存或者更新userId和token关系。如果userId已经存在则进行更新操作token操作。如果不存在则新增一条userId&token记录
     * 
     * @param userTokenDO
     *            实体
     * @return 是否成功
     */
    @DataSource(value = "master")
    public boolean saveOrUpdate(UserTokenDO userTokenDO);

    /**
     * 业务接口每次都会授权校验的validateToken接口。该接口PV最大，但是校验走的缓存系统，缓存系统故障后走DB。 算法业务：
     * token由每次登陆后服务器生成,客户端需调用登陆接口验证用户名密码通过后生成token返回客户端
     * 。第一次返回给客户端的token需要密钥加密传输，密钥客户端和服务器双方约定固定：‘miAo858Miao-92RE’进行AES对称加密后的token加密串，保证返回传输不泄密，token
     * post发送给客户端，该密码保存在客户端2进制代码中相对比较安全
     * ，扛反编译android，IOS不担心反编译不允许存储在资源文件中。如果觉得还不安全还需要对URL做签名用sign在做一次校，例如:sign=md5(url+token
     * +固定字符串'mIo98aiqing'),这样不同的url它拿到加密后的token也不能使用，需要校验sign。
     * 
     * @param userId
     *            用户ID
     * 
     * @param token
     *            token
     * @param uri
     *            除开主域名地址的业务URI
     * @param sign
     *            sign。
     * @param x
     *            解决方案,认证方法：最好的方案：新增校验参数：x=AES对称加密，（当前时间格式字符），密钥采用baseconfig中的key:token_secret_key,就是：an4@lx300#$o25#$。（x是时间戳），这样一般的手机和服务器的分钟应该都是一致的，很难偏差到小时，校验的时候就只校验5分钟偏差。也就是说用户在这个5分钟内是可以模拟攻击的，以外不行。这样可以减少那种损人不利己的攻击。
     * @author 邓杰
     * 
     * @return true表示鉴权成功。false表示失败
     */
    @DataSource(value = "slave")
    public Result validateToken(final long userId, final String token, final String uri, final String sign, final String x);

}
